home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
576-600
/
592
/
circlesup
/
circlesup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-15
|
10KB
|
507 lines
#include <intuition/intuition.h>
#include <graphics/sprite.h>
#include <math.h>
#include "easysound.c"
#include "easysound.h"
#include "spriteDATA.c"
#include "askc"
#include "titlec"
#include "stripc"
#include "mainaskc"
#include "infoc"
#include "rightc"
#include "leftc"
#include "letsgoc"
#define HEIGHT 200
#define WIDTH 320
#define DEPTH 5
struct Window *win;
struct Screen *scr;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct ViewPort *vp;
struct RastPort *rp;
struct IntuiMessage *message;
USHORT class;
USHORT code;
struct NewScreen ns =
{ 0,0,WIDTH,HEIGHT,5,0,1,NULL, /* View modes */
CUSTOMSCREEN, /* Screen type */
NULL, /* Font */
NULL,NULL,NULL /* CustomBitmap */ };
struct NewWindow nw =
{ 0,0,WIDTH,HEIGHT,0,1,MOUSEBUTTONS+RAWKEY, /* IDCMP flags */
ACTIVATE|BORDERLESS|RMBTRAP, /* Flags */
NULL,NULL,NULL, /* Gadget,Checkmark,Name */
NULL,NULL, /* Screen,BitMap */
WIDTH,HEIGHT,100,100, /* Max Width,Height, Min Width,Height */
CUSTOMSCREEN };
int loc[40][12],blue_ball;
struct SimpleSprite left_arrow = {
left_arrow_data,15,15,200,3 };
struct SimpleSprite right_arrow = {
right_arrow_data,15,15,200,3 };
int connect; /* This is a variable of how many circles the user wishes to
connect so they win the game */
CPTR boing;
UWORD chip dummydata[] = { 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 };
void _main()
{
int dum;
Open_Stuff();
if((GetSprite(&left_arrow,2))!=2) die(" I CAN GET SPRITE #2, SO I AM EXITING.");
if((GetSprite(&right_arrow,3))!=3) die(" I CAN GET SPRITE #3, SO I AM EXITING.");
MoveSprite(0,&left_arrow,8,184);
MoveSprite(0,&right_arrow,286,184); /* These are the arrows */
Init_Screen();
while(1)
{
ClearRASTPORT();
ClearLOCS();
DrawImage(rp,&mainask,76,81);
dum=1;
while(dum)
{
while((connect=idcmpch())==0);
if(connect==0x19)
{ dum=0; CirclesUp(); }
else if(connect==0x10) die("");
else if(connect==0x17) { dum=0; DisplayINFO(); }
}
}
die("");
}
DisplayINFO()
{
DrawImage(rp,&info,37,62);
while(idcmpch()!=0x45);
return(1);
}
WriteNumber()
{
char dum2[20];
SetAPen(rp,29);
sprintf(dum2,"%d",connect);
Move(rp,215,50);
Text(rp,dum2,strlen(dum2));
return(1);
}
CirclesUp()
{
int xpos,incr,dummy=1,input,player,player2,c=0,v,r;
int xpos2;
ClearRASTPORT();
ClearLOCS();
DrawImage(rp,&ask_image,52,106);
while(dummy)
{
while((connect=idcmpch())==0);
if(connect<=7&&connect>=3) dummy=0;
}
WriteNumber();
ClearRASTPORT();
DrawImage(rp,&letsgo,105,120);
Delay(75);
ClearRASTPORT();
while(1)
{
v=rand()%777;
if(v%2==1) /* This is the side which the circle flys in */
{ xpos=0; incr=6; }
else { xpos=288; incr=-6; }
if(++c%2==0)
{ player=0x64; player2=-1; ball2.PlanePick=4; }
else { player=0x65; player2=0x68; ball2.PlanePick=8; }
dummy=1;
if(rand()%25==0)
{ blue_ball=1; ball2.PlanePick=16; }
else blue_ball=0;
while(dummy)
{
xpos+=incr;
xpos2=xpos;
if(xpos2%12!=0) xpos2+=incr;
DrawImage(rp,&ball2,xpos,186);
input=idcmpch();
if(input==player||input==player2)
if(blue_ball==1)
{
if(xpos%12==0) { up2(xpos); dummy=0; }
else { xpos+=incr; DrawImage(rp,&ball2,xpos,186); up2(xpos); dummy=0; }
}
else
if(loc[(xpos2-12)/12][9]==0)
{
if(xpos%12==0) { r=up(xpos2,c%2+1); dummy=0; }
else { xpos+=incr; DrawImage(rp,&ball2,xpos2,186); r=up(xpos2,c%2+1); dummy=0; }
}
if(r==5||input==0x45) return(1);
if(xpos<=16&&incr==-6) dummy=0;
else if(xpos>=272&&incr==6) dummy=0;
WaitTOF();
}
ball2.PlanePick=0x00;
DrawImage(rp,&ball2,xpos,186);
}
return(1);
}
int up(int where,int who) /* This function sends an ordinary ball up */
{
int y,w,stop,up,across,max;
int gameover;
for(w=0;w<12;w++)
if(loc[(where-12)/12][w]==0)
{
stop=w;
loc[(where-12)/12][w]=who;
w=13;
}
across=(where-12)/12;
up=stop;
w=60+(stop*12);
where+=7;
ball.PlanePick=ball2.PlanePick;
for(y=186;y>w;y--)
DrawImage(rp,&ball,where,y);
StopSound(RIGHT0);
if(boing) PlaySound(boing,MAXVOLUME,RIGHT0,NORMALRATE,1);
max=how_many(across,up,who);
if(max>=connect) { gameover=1; AWinner(who); } else gameover=0;
if(gameover) return(5); else return(2);
}
AWinner(int w)
{
if(w==1) DrawImage(rp,&left,65,156);
else DrawImage(rp,&right,65,156);
while(idcmpch()!=0x45);
return(1);
}
int how_many(int across,int up,int person)
{ /* This function returns the maximum number of circles of the colour
just shot up either diagonally,horizontally or vertically. */
int n1,n2,n3,n4;
int dummy,c1,c2,max;
int a,u;
a=across; u=up; dummy=1; c1=0;
while(dummy)
{
if(a==0) dummy=0;
else {
--a;
if(loc[a][u]==person) c1++;
else dummy=0;
}
}
a=across; u=up; dummy=1; c2=0;
while(dummy)
{
if(a==39) dummy=0;
else {
++a;
if(loc[a][u]==person) c2++;
else dummy=0;
}
}
n1=c1+1+c2;
a=across; u=up; dummy=1; c1=0;
while(dummy)
{
if(u==0) dummy=0;
else {
--u;
if(loc[a][u]==person) c1++;
else dummy=0;
}
}
a=across; u=up; dummy=1; c2=0;
while(dummy)
{
if(u==11) dummy=0;
else {
++u;
if(loc[a][u]==person) c2++;
else dummy=0;
}
}
n2=c1+1+c2;
a=across; u=up; dummy=1; c1=0;
while(dummy)
{
if(u==0||a==0) dummy=0;
else {
--u; --a;
if(loc[a][u]==person) c1++;
else dummy=0;
}
}
a=across; u=up; dummy=1; c2=0;
while(dummy)
{
if(u==39||a==11) dummy=0;
else {
++u; ++a;
if(loc[a][u]==person) c2++;
else dummy=0;
}
}
n3=1+c1+c2;
a=across; u=up; dummy=1; c1=0;
while(dummy)
{
if(a==39||u==0) dummy=0;
else {
a++; --u;
if(loc[a][u]==person) c1++;
else dummy=0;
}
}
a=across; u=up; dummy=1; c2=0;
while(dummy)
{
if(a==39||u==11) dummy=0;
else {
--a; ++u;
if(loc[a][u]==person) c2++;
else dummy=0;
}
}
n4=c1+1+c2;
if(n1>n2) max=n1; else max=n2;
if(max<n3) max=n3;
if(max<n4) max=n4;
/* n1 is the value of how many circles where found horizontally from the
circle that was just sent up.
n2 is the value of how many circles where found vertically
n3 & n4 is the value of how many circles where found diagonally
AND finally max contains the largest of these 4 values */
return(max);
}
up2(int where) /* This function sends a blue ball up! */
{
int y;
where+=7;
for(y=1;y<12;y++)
loc[(where-12)/12][y]=0;
loc[(where-12)/12][0]=5;
ball.PlanePick=ball2.PlanePick;
for(y=186;y>60;y--)
DrawImage(rp,&ball,where,y);
StopSound(RIGHT0);
if(boing) PlaySound(boing,MAXVOLUME,RIGHT0,NORMALRATE,1);
return(TRUE);
}
ClearRASTPORT()
{
struct Image i = {
0,0,277,150,0,NULL,0,0,NULL };
DrawImage(rp,&i,18,61);
return(8);
}
Init_Screen()
{
int sec,micros;
ClearRASTPORT();
CurrentTime(&sec,µs);
srand(sec*9999+micros);
SetRGB4(vp,1,0xD,0xD,0);
SetRGB4(vp,2,0xB,0,0);
SetRGB4(vp,3,0,0xB,0);
SetRGB4(vp,4,15,0,0);
SetRGB4(vp,5,4,4,4);
SetRGB4(vp,6,8,8,8);
SetRGB4(vp,7,0xC,0xC,0xC);
SetRGB4(vp,8,0,15,0);
SetRGB4(vp,16,0,0,15);
SetRGB4(vp,29,13,13,13);
SetRGB4(vp,30,13,13,4);
DrawImage(rp,&title,0,0);
DrawImage(rp,&strip,4,61);
DrawImage(rp,&strip,295,61);
boing=PrepareSound("boing");
SetPointer(win,dummydata,1,1,0,0);
return(TRUE);
}
ClearLOCS()
{
int a,b;
for(a=0;a<40;a++)
for(b=0;b<12;b++)
loc[a][b]=0;
return(1);
}
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/*************************** ************************/
/*************************** Functions.... ************************/
/*************************** ************************/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
int idcmpch()
{
if(win->UserPort->mp_SigBit)
if(message=(struct IntuiMessage *)GetMsg(win->UserPort))
{
class=message->Class;
code=message->Code;
ReplyMsg((struct IntuiMessage *)message);
switch(class)
{
case MOUSEBUTTONS:
return((int)0x68);
case RAWKEY:
return((int)code);
}
}
return(0); /* Nothing interesting! */
}
Open_Stuff()
{
void *OpenLibrary();
struct Window *OpenWindow();
struct Screen *OpenScreen();
if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0)))
die("Can't open intuition.library");
if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0)))
die("Can't open graphics library");
if((scr=OpenScreen(&ns))==NULL)
die("");
nw.Screen=scr;
if(!(win=(struct Window *)OpenWindow(&nw)))
die("");
rp=win->RPort;
vp=&scr->ViewPort;
SetRGB4(vp,0,0,0,0);
return(TRUE);
}
die(s)
char *s[];
{
char Alert[300];
register int loop;
if(strlen(s)!=0) /* Display alert if s isn't NULL */
{
memset((void *)Alert,0,sizeof(Alert));
strcat(Alert,s);
strcat(Alert," Press either mouse button to continue.");
loop=strlen(s);
Alert[0]=0; Alert[1]=32; Alert[2]=16;
Alert[loop+2]='\0'; Alert[loop+3]=TRUE;
Alert[loop+4]=0; Alert[loop+5]=32; Alert[loop+6]=32;
Alert[loop+45]='\0'; Alert[loop+46]=FALSE;
DisplayAlert(RECOVERY_ALERT,Alert,48);
}
if((left_arrow.num)!=-1) FreeSprite(left_arrow.num);
if((right_arrow.num)!=-1) FreeSprite(right_arrow.num);
StopSound(RIGHT0);
if(boing) RemoveSound(boing);
if(win) CloseWindow(win);
if(scr) CloseScreen(scr);
if(GfxBase) CloseLibrary(GfxBase);
if(IntuitionBase) CloseLibrary(IntuitionBase);
exit();
return(TRUE);
}